package com.tledu.zyf.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.tledu.zyf.model.User;

public class AuthInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		// 转换为 HandlerMethod 对象
		HandlerMethod handlerMethod = (HandlerMethod) handler;

		// 获取请求的方法
		String methodName = handlerMethod.getMethod().getName();
		System.out.println(methodName);

		// 如果不是主页和登录相关的,就判断是否登录
		if (!methodName.equals("index") && !methodName.equals("login")) {
			// 1 获取 session
			HttpSession session = request.getSession(true);
			// 2 获取 session 中的 loginUser
			User loginUser = (User) session.getAttribute("loginUser");
			// 3 判断是否为空
			if (loginUser == null) {
				// 未登录 跳转到登录页面
				response.sendRedirect(request.getContextPath() + "/");
				/**
				 * return false 设置不放行
				 * 
				 * 如果不加这句话,最终结果也是跳转到登录页面,效果是一样的
				 * 
				 * 但是,如果不写 false ,程序还会继续向下执行,一直执行到放行,那么就会先去执行对应的请求操作
				 * 
				 * 执行完成后,在跳转到登录页面,因为重定向跳转需要请求完成之后,再次发送请求
				 * 
				 * 比如,请求user/list,但是没有登录,并且这里也没有写 false ,那么最终显示的依旧是登录页面
				 * 
				 * 但是,会先去执行 UserController 中的 list 方法,执行完成后,再跳转到登录页面,而不是直接进入登录页面
				 * 
				 * 所以,我们需要添加 return false 不放行
				 * 
				 */
				return false;
			}
		}
		return super.preHandle(request, response, handler);
	}
}
